from typing import Any, Dict

import pytest

from utils.util_sql_action import DBUtil
from utils.util_logger import logger


def setup_teardown_tool(
    db_util_session: DBUtil, setup_teardown_data: dict, type_case: str
):
    """
    处理前后置数据工具:
    params: db_util_session: 数据库连接-DBUtil类型
    params: setup_teardown_data: 前后置数据(dict)
    params: type_case: 数据类型, str类型, 仅能传递["setup", "teardown"]
    """
    # 判断是否是["setup", "teardown"]
    if type_case not in ["setup", "teardown"]:
        raise ValueError(f'Faid: {type_case} not in ["setup", "teardown"]')

    # 前后置数据为空,且类型为setup
    if not setup_teardown_data and type_case == "setup":
        pytest.skip(reason=f"Skip: 无需处理setup")
    # 前后置数据为空,且类型为teardown
    if not setup_teardown_data and type_case == "teardown":
        pytest.skip(reason=f"Skip: 无需处理teardown")

    # 循环读取数据库方法和数据库参数
    # sql_method: DBUtil中的数据库方法
    # sql_args: 数据库方法的参数
    for sql_method, sql_args in setup_teardown_data.items():

        if sql_method == "query_by_username":
            # 按username查询数据
            if isinstance(sql_args, str):
                return db_util_session.query_by_username(sql_args)
            else:
                logger.info(f"Fail: {sql_method}方法参数{sql_args}非str类型!")
                raise ValueError(f"Fail: {sql_method}方法参数{sql_args}非str类型!")

        elif sql_method == "query_by_id":
            # 按id查询数据
            if isinstance(sql_args, int):
                return db_util_session.query_by_id(sql_args)
            else:
                logger.info(f"Fail: {sql_method}方法参数{sql_args}非int类型!")
                raise ValueError(f"Fail: {sql_method}方法参数{sql_args}非int类型!")

        elif sql_method == "query_all":
            return db_util_session.query_all()

        elif sql_method == "delete_by_username":
            # 删除操作：先查询是否存在，存在则删除
            if isinstance(sql_args, str):
                # 判断用户是否存在
                if db_util_session.query_by_username(sql_args):
                    db_util_session.delete_by_username(sql_args)
                    logger.info(f"delete {sql_args} Success!")
                    return True
                else:
                    logger.info(f"{sql_args} 不存在, 跳过delete_by_username继续执行!")
                    continue
            else:
                logger.info(f"Fail: {sql_method}-方法参数{sql_args}-非str类型!")
                raise ValueError(f"Fail: {sql_method}-方法参数{sql_args}-非str类型!")

        elif sql_method == "insert_sql":
            if isinstance(sql_args, dict):
                db_util_session.insert_sql(sql_args)
                if db_util_session.query_by_username(sql_args.get("username")):
                    logger.info(f"insert Success: {sql_method}- {sql_args}")
            else:
                logger.info(f"Fail: {sql_method}-方法参数{sql_args}-非dict类型!")
                raise ValueError(f"Fail: {sql_method}-方法参数{sql_args}-非dict类型!")
